package com.naiterui.common.repository.core;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.query.QueryByExampleExecutor;

/**
 * 基于Spring-data-jpa定义的用于MongoDB的数据操作接口
 * 为了保持持久方法名称的统一重新定义了save 和 update两个方法
 * 1、继承MongoRepository，支持较为丰富的基本操作，同时支持声名方法式查询；
 * 2、继承了QueryByExampleExecutor，支持通过实例进行查询；
 * 3、对于deleteAll等风险较高的操作，在实现类中通过重写进行了屏蔽，避免出现勿用而引发事故；
 *
 * @author zhouyanxin
 * @since 1.0.0
 */
@NoRepositoryBean
public interface BaseMongoRepository<T, ID extends Serializable> extends BaseOperations<T, ID>, MongoRepository<T, ID>, QueryByExampleExecutor<T> {

    /**
     * 自定义Query 查询
     * BaseMongoRepositoryImpl.find()
     *
     * @param query
     *
     * @return
     *
     * @since 1.0.0
     */
    List<T> find(Query query);

    /**
     * 自定义Query page查询
     *
     * @param query
     * @param pageable
     *
     * @return
     */
    Page<T> find(Query query, Pageable pageable);

    /**
     * 自定义Query count查询
     * BaseMongoRepositoryImpl.count()
     *
     * @param query
     *
     * @return
     *
     * @since 1.0.0
     */
    long count(Query query);
}
